home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 18 / AMIGAplus Sonderheft 18 (1999)(ICP)(DE)[!].iso / Forum / MichaelRoth / 3-3-99 / code / code1.asm < prev    next >
Assembly Source File  |  1998-08-15  |  6KB  |  208 lines

  1.  
  2. ;// Include
  3.           Include  assem:macro/Dir
  4.           Include  assem:macro/Exec.m
  5.           Include  assem:macro/Dos.m
  6.           Include  Dos/DosExtens.i
  7.           include  macro/filelength
  8. ;\\
  9.  
  10. ;// Libraries öffnen
  11.           OpenDos  37
  12. ;\\
  13.  
  14. ;//ReadArgs
  15.           move.l   #inputstr,d1                  ; Eingabe String
  16.           move.l   #arry,d2                      ; Arry
  17.           move.l   #0,d3                         ; Keine Externe Structur
  18.           Dos      ReadArgs                      ; Argumente Lesen
  19.           move.l   d0,rdargs                     ; speichern
  20.           bne.s    .1                            ; prüfen ob alles o.k.
  21.           error    cleanup,20                    ; o.k. >.1 Ansonsten Fehlermeldung beenden
  22. .1                                               ;
  23.           lea   arry,a0                          ; Arry nach a0
  24. ;\\
  25.  
  26. ;//File Öffnen und gröe bestimmen
  27.           move.l   (a0),d1
  28.           move.l   #MODE_OLDFILE,d2              ; 1005
  29.           Dos      Open                          ; File Öffnen
  30.           bne.s    .2
  31.           error    cleanup,20
  32. .2
  33.           move.l   d0,fh
  34.           filelength fh,filelänge                ; Filelänge bestimmen
  35. ;\\
  36.  
  37. ;// Speicher Reservieren
  38.          move.l    filelänge,d0
  39.          move.l    #MEMF_CLEAR,d1
  40.          Exec      AllocMem
  41.          move.l    d0,memblock
  42.          bne.s     .memallockok
  43.          error     cleanup,20
  44. .memallockok
  45. ;\\
  46.  
  47. ;// File einlesen
  48.          move.l   fh,d1
  49.          move.l   memblock,d2
  50.          move.l   filelänge,d3
  51.          Dos      Read
  52.          cmp.l    filelänge,d0
  53.          beq.s    .readok
  54.          error    cleanup,20
  55. .readok
  56. ;\\
  57.  
  58. ;// Code
  59.  
  60.  
  61.  
  62. ; A0   -> Buffer zum Codieren
  63. ; D0   -> Länge des Buffers
  64. ; D2.b -> Anfangszeichen des VQ's
  65. ; A1   -> KEy
  66. ; D1   -> Länge
  67.  
  68. ;//; SUBREGISTER
  69. ; A2 -> Endadresse ds Buffers
  70. ; A3 -> Endadresse des Keys
  71. ; D7 -> StartAdresse des Keys
  72. ; A4 -> VQ Adresse
  73. ; D4 -> allg. Subreg.
  74. ;\\; A5 -> Adresse der Zeile
  75.  
  76.          move.l    memblock,a0
  77.          move.l    filelänge,d0
  78.          move.l    #32,d2
  79.          lea       ver,a1
  80.          move.l    #ver,d1
  81.          move.l    #ver2,d4
  82.          sub.l     d4,d1
  83.  
  84.          lea       (a0,d0.l),a2                  ; Endadresse des Buffers
  85.          lea       (a1,d1.l),a3                  ; und Endadresse des KEy Berechnen
  86.          sub.b     #1,d2
  87.          lea       vq,a4
  88.          move.w    #255,d7
  89. .loop1
  90.          move.w    #255,d6
  91.          add.b     #1,d2                         ; Äusere schliefe mit je etwa 20 Zyklen
  92.          move.b    d2,d4
  93. .loop2
  94.          move.b    d4,(a4)+
  95.          add.b     #1,d4                         ; Innere schleife mit 256 schritten zu je etwa 30 Zyklen
  96.          dbra      d6,.loop2
  97.          dbra      d7,.loop1
  98.  
  99.          move.l    a1,d7                         ; Adresse des Keys wegen Blockcodierung aufhaben
  100.  
  101.          lea       vq,a4
  102. .loop3
  103.          moveq     #0,d5
  104.          moveq     #0,d4
  105.          move.b    (a1)+,d4                      ; Zeichen von KEy laden
  106.          move.b    (a0),d5                       ; Klartextzeichen laden
  107.          lsl.w     #8,d4                         ; mit k = 256 Multiplizieren *1
  108.          add.l     d5,d4                         ; Offset addieren
  109.          move.b    (a4,d4),(a0)+                 ; Zeile berechnen und auslesen sowie speichern
  110.  
  111.          cmp.l     a1,a3                         ; Schlüsselvorrat zu Ende ?
  112.          bhi.s     .goon                         ; Nein -> Weiter
  113.          move.l    d7,a1                         ; Schlüssel von vorne verwenden
  114. .goon
  115.          cmp.l     a0,a2                         ; Buffer am ende ?
  116.          bhi.s     .loop3                        ; nein -> nächsten Zeichen
  117.  
  118. *1 Ich mache mir das verschieben von Bits zu nutze; denn dies ist bei
  119. *1 Multiplikationen mit 2^x möglich.
  120. *1 Die Multiplikation mit MULU würde 70 Takte benötigen; so brauche ich
  121. *1 aber nur 24 Takte...
  122.  
  123. ;\\
  124.  
  125. ;// Zielfile Öffnen
  126.          lea       arry,a0                          ; Arry nach a0
  127.          move.l    4(a0),d1
  128.          move.l    #MODE_NEWFILE,d2
  129.          Dos       Open
  130.          move.l    d0,d7
  131.          bne       .ok
  132.          error     cleanup,20
  133. .ok
  134.  
  135.          move.l    d7,d1
  136.          move.l    memblock,d2
  137.          move.l    filelänge,d3
  138.          Dos       Write
  139.  
  140.          move.l    d7,d1
  141.          Dos       Close
  142. ;\\
  143.  
  144. ;// CleanUp
  145. cleanup
  146.           move.l   rdargs,d1
  147.           beq.s    .end                          ; Argumente da ?
  148.           Dos      FreeArgs                      ; Wenn Nein beenden
  149.  
  150.           move.l   fh,d1
  151.           beq.s    .1                            ; File geöffnet
  152.           Dos      Close                         ; Wenn nein weiter
  153. .1
  154.           move.l    memblock,d0
  155.           beq.s     .2
  156.           move.l    d0,a1
  157.           move.l    filelänge,d0
  158.           Exec      FreeMem
  159. .2
  160.           move.l   fh2,d1
  161.           beq.s    .3                            ; File geöffnet
  162.           Dos      Close                         ; Wenn nein weiter
  163. .3
  164.           move.l    memblock2,d0
  165.           beq.s     .4
  166.           move.l    d0,a1
  167.           move.l    filelänge2,d0
  168.           Exec      FreeMem
  169. .4
  170.  
  171.  
  172.  
  173. .end
  174.           closedos
  175.           moveq    #0,d0
  176.           rts
  177. ;\\
  178.  
  179. ;// Data
  180.  DATA
  181.  
  182. ver   dc.b "$VER: V0 - Written by DAC698 - Michael Roth",0
  183. ver2
  184. inputstr
  185.          dc.b      "Source/A,Dest/A",0;,Key/A",0 ;KeyFile/S",0
  186. cr
  187.          dc.b      10,0
  188.  BSS
  189.  cnop 0,4
  190.  
  191. vq
  192.          ds.b      256*256
  193.  cnop 0,4
  194. arry     ds.l      2
  195. rdargs   ds.l      1
  196. fh       ds.l      1
  197. fh2      ds.l      1
  198. filelänge
  199.          ds.l      1
  200. memblock ds.l      1
  201. filelänge2
  202.          ds.l      1
  203. memblock2
  204.          ds.l      1
  205. insert   dc.b      4,0
  206. ;\\
  207.  
  208.